/*--------------------------------------------------------------------------------------------------------------------
 *  -------------------------------------------------------------------------------------------------------------------
 *
 *  Filename: ps_api.h
 *
 *  Description: AT interface prototypes for yuge AT commands
 *
 *  History:
 *  Jan 9, 2020- Li Tang Creation of file
 *
 *  Notes:
 *
 ******************************************************************************/
#ifndef _TIME_API_H
#define _TIME_API_H

#include "gbl_types.h"

/*
  使用该头文件时，最好不要引用编译器的time.h，
  即代码中最好不要出现  "#include <time.h>" 或者 "#include "time.h""
  如果其他移植过来的代码编译报错，可以注释掉"#include <time.h>" 或者 "#include "time.h""
*/

typedef struct rtc_time {
  int tm_sec;	//seconds [0,59]
  int tm_min;	//minutes [0,59]
  int tm_hour;  //hour [0,23]
  int tm_mday;  //day of month [1,31]
  int tm_mon;   //month of year [1,12]
  int tm_year; // since 1970
  int tm_wday; // sunday = 0
}t_rtc;

struct tm
{ /* A structure for storing the attributes of a broken-down time; (once
   * again, it isn't defined elsewhere, so no guard is necessary).  Note
   * that we are within the scope of <time.h> itself, so we must provide
   * the complete structure declaration here.
   */
  int  tm_sec;  	/* Seconds: 0-60 (to accommodate leap seconds) */
  int  tm_min;  	/* Minutes: 0-59 */
  int  tm_hour; 	/* Hours since midnight: 0-23 */
  int  tm_mday; 	/* Day of the month: 1-31 */
  int  tm_mon;  	/* Months *since* January: 0-11 */
  int  tm_year; 	/* Years since 1900 */
  int  tm_wday; 	/* Days since Sunday (0-6) */
  int  tm_yday; 	/* Days since Jan. 1: 0-365 */
  int  tm_isdst;	/* +1=Daylight Savings Time, 0=No DST, -1=unknown */
};

typedef enum {
	SYS_OFFSET,
	APP_OFFSET
}PMIC_RTC_OFFSET_TYPE;

/*****************************************************************
* Function: time
*
* Description:
* 	该函数用于当前时间戳，单位：秒，自1970年1月1日午夜开始。
* Parameters:
* 	t 		[out] 	NULL 即可。
* Return:
* 	 time_t :  当前时间戳，单位：秒，自1970年1月1日午夜开始。
*****************************************************************/
time_t time(time_t *t);

/*****************************************************************
* Function: pmic_rtc_to_tm
*
* Description:
* 	该函数用于转换时间戳（秒）成tm时间数据。
* Parameters:
* 	tim 		[in] 	时间戳，单位：秒。
* 	tm   		[out] tm时间数据。
* Return:
* 	 0 :  成功。
* 	 -1 :  失败。
*****************************************************************/
int pmic_rtc_to_tm(int tim, t_rtc *tm);

/*****************************************************************
* Function: pmic_rtc_to_tm
*
* Description:
* 	该函数用于转换tm时间数据成时间戳（秒）。
* Parameters:
* 	tm   		[in] tm时间数据。
* Return:
* 	 时间戳，单位：秒。
*****************************************************************/
int pmic_rtc_mktime(const t_rtc *tm);

/*****************************************************************
* Function: gettimeofday
*
* Description:
* 	该函数用于获取timeval 时间数据。
* Parameters:
* 	tv   		[out] timeval时间数据。
* 	dummy 	[in] NULL即可。
* Return:
* 	 0 :  成功。
* 	 -1 :  失败。
*****************************************************************/
/*
如果客户需要使用该接口，代码中添加该段源码即可
int gettimeofday(struct timeval *tv, void* dummy)
{
	unsigned int t;

	t = time(NULL);

	if(tv != NULL){
		tv->tv_sec = t;
		//tv->tv_usec = millisecond_get()*1000;
    tv->tv_usec = 0;
		return 0;
	}else{
		return -1;
	}
}
*/

/*****************************************************************
* Function: lte_module_time_get
*
* Description:
* 	该函数用于获取当前utc时间，已经时区信息。
* Parameters:
* 	getTime   		[out] t_rtc格式的UTC时间
* 	timezone   		[out] 同AT+CCLK？中的时区信息 （-48~+48），15分钟一个时区，即（西12区~东12区）
* 	tztype   		  [out] 0：系统默认时区或者lte_module_time_set写入的时区，不确定是否准确。 1：+NITZ同步的时区，时区准确。
*                       备注：系统开机通过两种方式同步时间，大部分运营商都是此两种方式
*                             a)、移动电信卡，通过NITZ同步时间，即通过基站同步，此方式下同步的时区准确。
*                             b)、联通卡，通过NTP同步时间，此方式下不会同步的时区信息，时区信息需要客户自行确定。
* Return:
* 	 None
*****************************************************************/
void lte_module_time_get(t_rtc *getTime, int *timezone, int *tztype);

/*****************************************************************
* Function: lte_module_time_get
*
* Description:
* 	该函数用于同步setTime到系统中。
* Parameters:
* 	setTime   		[in] t_rtc格式的UTC时间
* 	timezone   		[in] 同AT+CCLK？中的时区信息 （-48~+48），15分钟一个时区，即（西12区~东12区），如果不更新时区设置NULL即可
*
* Return:
* 	 None
*****************************************************************/
void lte_module_time_set(t_rtc *setTime, int *timezone);

/*****************************************************************
* Function: lte_module_ntp_get_server
*
* Description:
* 	该函数用于查询系统ntp请求时使用的服务器。
* Parameters:
* 	 None
*
* Return:
* 	 字符串，ntp服务器信息。
*****************************************************************/
char *lte_module_ntp_get_server(void);

/*****************************************************************
* Function: lte_module_ntp_set_server
*
* Description:
* 	该函数用于更新系统ntp请求时使用的服务器。
* Parameters:
* 	ntp_server   		[in] ntp服务器信息
*
* Return:
* 	 None
*****************************************************************/
void lte_module_ntp_set_server(char * ntp_server);


/*****************************************************************
* Function: lte_module_ntp_request
*
* Description:
* 	该函数用于更新系统ntp请求时使用的服务器。
* Parameters:
* 	sync         		[in] ntp请求成功后是否自动同步时间到系统中，0：不同步，1同步
* 	ntp_cb       		[in] ntp请求回调函数，参数说明
*                        0： 成功， 获取的时间信息
*                        -1： 失败， NULL
*
* Return:
* 	 None
*****************************************************************/
void lte_module_ntp_request(int sync, void (*ntp_cb)(int, char *));

#endif

